﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Interfaces;

namespace Model
{
    public class Faktura : IFakturadata
    {
        // attributter
        private int fakturaNr;
        private string valutaType;
        private DateTime fakturadato;
        private DateTime leveringsdato;
        private DateTime betalingsdato;
        private string betalingsmetode;
        private string besked;
        private double subtotalEkskl;
        private double momsBeløb;
        private double total;

        private List<Vare> varer;

        // konstruktør
        public Faktura(int fakturaNr, string valutaType, DateTime fakturadato, DateTime leveringsdato, DateTime betalingsdato,
            string betalingsmetode, string besked)
        {
            this.fakturaNr = fakturaNr;
            this.valutaType = valutaType;
            this.fakturadato = fakturadato;
            this.leveringsdato = leveringsdato;
            this.betalingsdato = betalingsdato;
            this.betalingsmetode = betalingsmetode;
            this.besked = besked;
            subtotalEkskl = 0;
            momsBeløb = 0;
            total = 0;

            varer = new List<Vare>();
        }

        #region Metoder til faktura-objekter

        // metode til at udregne subtotal ekskl. moms
        public void UdregnSubtotalEkskl()
        {
            subtotalEkskl = 0;

            foreach (Vare v in varer)
            {
                v.UdregnVaretotalEkskl();
                subtotalEkskl += v.VaretotalEkskl;
            }
        }

        // metode til at udregne det beløb som momsen udgør
        public void UdregnMomsBeløb()
        {
            momsBeløb = 0;

            foreach (Vare v in varer)
            {
                v.UdregnVaretotalEkskl();
                momsBeløb += v.VaretotalEkskl / 100 * v.Moms;
            }
        }

        // metode til at udregne total
        public void UdregnTotal()
        {
            UdregnSubtotalEkskl();
            UdregnMomsBeløb();

            total = subtotalEkskl + momsBeløb;
        }

        #endregion

        #region Metoder til vare-objekter

        // metode til at oprette et vare-objekt
        public void OpretVare(int vareID, string varebeskrivelse, int antal, string enhed, double prisPrEnhedEkskl,
            double moms, double varetotalEkskl)
        {
            Vare vare = new Vare(vareID, varebeskrivelse, antal, enhed, prisPrEnhedEkskl, moms, varetotalEkskl);
            varer.Add(vare);
        }

        // metode til at finde et vare-objekt
        public Vare FindVare(int vareID)
        {
            foreach (Vare v in varer)
            {
                if (v.VareID == vareID)
                {
                    return v;
                }
            }

            return null;
        }

        // metode til at hente vare-iterator
        public IEnumerator GetVarer()
        {
            return varer.GetEnumerator();
        }

        // metode til at finde et faktura-objekts antal af vare-objekter
        public int GetAntalVarer()
        {
            return varer.Count();
        }

        // kald af metode til at udregne total beløb for en vare ekskl. moms
        public void UdregnVaretotalEkskl(int vareID)
        {
            Vare v = FindVare(vareID);
            v.UdregnVaretotalEkskl();
        }

        #endregion

        #region Properties

        public int FakturaNr
        {
            get { return fakturaNr; }
        }

        public string ValutaType
        {
            get { return valutaType; }
        }

        public DateTime Fakturadato
        {
            get { return fakturadato; }
        }

        public DateTime Leveringsdato
        {
            get { return leveringsdato; }
        }

        public DateTime Betalingsdato
        {
            get { return betalingsdato; }
        }

        public string Betalingsmetode
        {
            get { return betalingsmetode; }
        }

        public string Besked
        {
            get { return besked; }
        }

        public double SubtotalEkskl
        {
            get { return subtotalEkskl; }
            set { subtotalEkskl = value; }
        }

        public double MomsBeløb
        {
            get { return momsBeløb; }
            set { momsBeløb = value; }
        }

        public double Total
        {
            get { return total; }
            set { total = value; }
        }

        #endregion
    }
}
